'''
系统类
	因为一个程序可能有很多用户，则需要将用户保存在本地
			将注册的用户添加在字典中
				key：用户id 【用户id随机产生即可，从10000~99999中随机产生一个】
				value：对应的用户对象

	行为：
	用户注册——》根据下面信息生成一个用户，并将用户保存在本地
		随机产生 id
		输入姓名和密码
		创建一个购物车对象

	登录 ——》 登录成功返回为 True  否则返回为 False
		输入用户id 检测是否有该用户  没有的话提示注册
		有的话检测用户登录状态 若为 True  提示已登录
		否则 再输入密码进行登录
			不要忘记修改用户的登录状态

	向购物车中添加商品 ——》验证用户是否登录，没有登录提示登录
		否则
			列出仓库中商品名单
				1. Mac电脑
				2.PthonBook
				3.草莓键盘
				4.iPhone
			用户输入对应的编号 在仓库中获得对应的商品
			用户输入数量 — 与该商品的的剩余量对比
				> 剩余量
					让用户重新输入并提示该商品的剩余量
				<=剩余量
					将该商品添加在该用户的购物车中
					并将仓库中的数据量做出相应的减少
				注意：将修改之后的结果同步在本地文件中，时刻保持数据的正确性

	删除购物车的商品——》验证用户是否登录，没有登录提示登录
		否则
			请用户输入商品名字 查看该用户的购物车中是否有该商品
			如果没有，提示购物车中没有该商品
			否则：
				先选择要删除的商品
				请用户设置删除的数量
					数量  >=   购物车中商品数量
						购物车清单中删除该商品
					否则：
						购物车清单中做出相应的减少
			注意：将修改之后的结果同步在本地文件中，时刻保持数据的正确性

	结算——》验证用户是否登录 没有登录提示登录
		否则
			获取该用户的购物车中商品清单，计算总额
		注意： 结算完成 购物车清空
			  将修改之后的结果同步在本地文件中，时刻保持数据的正确性

	退出登录———》验证用户是否登录 没有登录提示登录
		否则
			修改用户登录状态
		注意：将修改之后的结果同步在本地文件中，时刻保持数据的正确性
'''
import os,pickle,random

from goods import Goods
from storage import Storage
from user import User
from shoppingcar import ShoppingCar

user_path = r'D:\python-spider\python-office\06-购物车\shopcar1\data\usrlist.txt'

class Operation():
    __slots__ = ('users_dict')
    def __init__(self):
        self.__load_user()

    # 加载用户
    def __load_user(self):
        if os.path.exists(user_path):
            with open(user_path,'rb') as f:
                self.users_dict = pickle.load(f)
        else:
            self.users_dict = {}

    # 保存用户
    def __save_user(self):
        with open(user_path,'wb') as f:
            pickle.dump(self.users_dict,f)

    def __get_uid(self):
        while True:
            uid = str(random.randint(10000,99999))
            if uid not in self.users_dict:
                return uid

    # 注册用户
    def user_register(self):
        # 获取用户信息

        uname = input('请输入用户名：')
        pwd = input('请输入密码：')
        uid = self.__get_uid()
        print('您的用户id：',uid)
        sp = ShoppingCar()

        user = User(uid=uid,uname=uname,pwd=pwd,shopcar=sp)
        self.users_dict[uid] = user

        # 将用户字典序列化到本地
        self.__save_user()


    # 登录
    def user_login(self):
        uid = input('请输入用户id：')

        if uid not in self.users_dict:
            print('用户不存在，请注册')
            self.register_user()

        user = self.users_dict[uid]
        if user.islogin:
            print('用户已登录')
            return user


        while True:
            uname = input('请输入用户名：')
            pwd = input('请输入密码：')
            if uname == user.uname and pwd == user.pwd:
                print('登录成功')
                user.islogin = True
                return user
            else:
                print('用户名或密码错误')


    # 向购物车中添加商品
    def add_goods(self):
        user = self.user_login()
        if not user:
            print('请先登录')
            return

        print('商品列表：')
        storage = Storage()
        for i,good in enumerate(storage.goods_list):
            print(f'{i}: {good.name}')

        index = input('请输入商品编号：')
        if index.isdigit():
            index = int(index)
            if index >= len(storage.goods_list):
                print('商品编号错误')
            else:
                storage_goods = storage.goods_list[index]
                num = int(input('请输入商品数量：'))
                if num < 0:
                    print('商品数量错误')
                else:
                    while num > storage_goods.balance:
                        print('商品数量不足')
                    else:
                        shopcar_goods = Goods(name=storage_goods.name,gprice=storage_goods.gprice,balance=num)
                        user.shopcar.good_dict[shopcar_goods] = num
                        storage_goods.balance -= num


                        self.__save_user()
                        storage.save_goods()
                        print('商品添加成功')

        else:
            print('请输入数字')

    # 删除购物车商品
    def del_goods(self):
        user = self.user_login()
        if not user:
            print('请先登录')
            return

        # 需要删除的商品
        gname = input('请输入要删除的商品：')

        shopcar_goods = None
        storage_goods = None
        # 判断商品是否存在标识
        flag = False

        for good in user.shopcar.good_dict:
            if good.name == gname:
                shopcar_goods = good
                flag = True

        if not flag:
            print(f'购物车中没有该{gname}')
            return

        storage = Storage()
        for good in storage.goods_list:
            if good.name == gname:
                storage_goods = good

        num = int(input(f'请输入要删除的{gname}数量：'))

        if num >= user.shopcar.good_dict[shopcar_goods]:
            # 数量超出购物车情况
            user.shopcar.good_dict.pop(shopcar_goods)
            # 加回该商品购物车所有数量
            storage_goods.balance += shopcar_goods.balance
        else:

            shopcar_goods.balance -= num
            user.shopcar.good_dict[shopcar_goods] -= shopcar_goods.balance
            storage_goods.balance += num

        # 同步数据到本地
        self.__save_user()
        storage.save_goods()

        print('商品删除成功！')




    # 结算
    def get_total(self):
        user = self.user_login()
        if not user:
            print('请先登录')
            return

        total = 0
        for good, num in user.shopcar.good_dict.items():
            total += good.gprice * num
        print(f'结算金额：{total}')

        # 清空购物车
        user.shopcar.good_dict.clear()

        # 同步数据到本地文件
        self.__save_user()

    # 退出登录
    def user_quit(self):
        user = self.user_login()
        if user:
            user.islogin = False
            # 同步数据到本地文件
            self.__save_user()

            print('用户注销成功')